// 管理状态的模块
import Vue from "vue"
import Vuex from "vuex"
Vue.use(Vuex)
// 创建实例
const store = new Vuex.Store({
  state: {
    // 保存购物车数据,格式为 {id,count,isChecked,price}
    // 从本地读取数据
    cart: JSON.parse(localStorage.getItem("cart")) || []
  },
  mutations: {
    // 一、添加购物车
    addCart(state, goods) {
      // 1.1 判断传递过来的商品是否存在,存在就让购物车相应数量加一
      const istrue = state.cart.some(item => {
        if (item.id === goods.id) {
          item.count += goods.count
          return true
        }
      })
      // 1.2 如果不存在就直接push到cart数组中
      if (!istrue) state.cart.push(goods)

      // 1.3 将数据保存到本地
      localStorage.setItem("cart", JSON.stringify(state.cart))
    },
    // 二、修改购物车数量
    updateCount(state, obj) {
      // 2.1 根据id找到对应商品,重新修改cart中的数据
      // console.log(obj)
      state.cart.find(item => item.id === obj.id).count = obj.count
      // 2.2 将数据保存到本地
      localStorage.setItem("cart", JSON.stringify(state.cart))
    },
    // 五、根据id删除购物车对应项
    delCart(state, id) {
      // console.log(id)
      // 5.1 过滤出不需要删除的那一项
      state.cart = state.cart.filter(item => item.id !== id)
      // console.log(state.cart)
      // 5.2 将数据保存到本地
      localStorage.setItem("cart", JSON.stringify(state.cart))
    },

    // 七、根据id修改选中状态
    updataChecked(state, obj) {
      // console.log(obj)
      // 7.1 将对应项的选中状态取反
      state.cart.find(item => item.id === obj.id).isChecked = !obj.isChecked
      // 7.2 将数据保存到本地
      localStorage.setItem("cart", JSON.stringify(state.cart))
    }
  },
  getters: {
    // 三、计算商品总数量
    totalCount(state) {
      return state.cart.reduce((sum, item) => (sum += item.count), 0)
    },

    // 四、根据id创建一个对象,格式为{ id: 商品数量 }
    objCount(state) {
      const objCount = {}
      state.cart.forEach(item => (objCount[item.id] = item.count))
      return objCount
    },

    // 六、根据id创建一个商品是否选中的对象
    objChecked(state) {
      const objChecked = {}
      state.cart.forEach(item => (objChecked[item.id] = item.isChecked))
      return objChecked
    },

    // 八、计算选中商品的总件数
    totalCheckedCount(state) {
      return state.cart.reduce((sum, item) => {
        if (item.isChecked === true) {
          sum += item.count
        }
        return sum
      }, 0)
    },

    // 九、计算选中商品的总价格
    totalCheckedPrice(state) {
      return state.cart.reduce((sum, item) => {
        if (item.isChecked === true) {
          sum += item.count * item.price
        }
        return sum
      }, 0)
    }
  }
})
// 导出
export default store
